package org.gexperiments.cool;

import java.awt.Font;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

import prefuse.Constants;
import prefuse.Display;
import prefuse.Visualization;
import prefuse.action.ActionList;
import prefuse.action.assignment.ColorAction;
import prefuse.action.assignment.DataSizeAction;
import prefuse.action.assignment.FontAction;
import prefuse.action.layout.graph.BalloonTreeLayout;
import prefuse.activity.Activity;
import prefuse.controls.DragControl;
import prefuse.controls.PanControl;
import prefuse.controls.ZoomControl;
import prefuse.data.Graph;
import prefuse.data.io.DataIOException;
import prefuse.data.io.GraphMLReader;
import prefuse.render.DefaultRendererFactory;
import prefuse.render.ImageFactory;
import prefuse.render.LabelRenderer;
import prefuse.util.ColorLib;
import prefuse.util.FontLib;
import prefuse.visual.VisualItem;

public class Example {

	public static void main(String[] argv) throws Exception {

		Graph graph = null;
		try {

			graph = new GraphMLReader().readGraph("/graph.xml");
		} catch (DataIOException e) {
			e.printStackTrace();
			System.err.println("Error loading graph. Exiting...");
			System.exit(1);
		}

		ImageFactory imageFactory = new ImageFactory(100, 100);

		try {
			// load images and construct imageFactory.
			String[] names = new String[] { "Switch", "Network", "Router" };
			Image img = new ImageIcon(LayoutExample.class.getClassLoader().getResource("osa_hub.png")).getImage();

			for (int i = 0; i < names.length; i++) {
				imageFactory.addImage(names[i], img);
			}

		} catch (Exception exp) {

		}

		Visualization vis = new Visualization();
		vis.add("graph", graph);

		LabelRenderer nodeRenderer = new LabelRenderer("name", "type");
		nodeRenderer.setVerticalAlignment(Constants.BOTTOM);
		nodeRenderer.setHorizontalPadding(0);
		nodeRenderer.setVerticalPadding(0);
		nodeRenderer.setImagePosition(Constants.TOP);
		nodeRenderer.setMaxImageDimensions(100, 100);

		DefaultRendererFactory drf = new DefaultRendererFactory();
		drf.setDefaultRenderer(nodeRenderer);
		vis.setRendererFactory(drf);

		ColorAction nText = new ColorAction("graph.nodes", VisualItem.TEXTCOLOR);
		nText.setDefaultColor(ColorLib.gray(100));

		ColorAction nEdges = new ColorAction("graph.edges", VisualItem.STROKECOLOR);
		nEdges.setDefaultColor(ColorLib.gray(100));

		// bundle the color actions
		ActionList draw = new ActionList();

		// MAD - changing the size of the nodes dependent on the weight of the
		// people
		final DataSizeAction dsa = new DataSizeAction("graph.nodes", "size");
		draw.add(dsa);

		draw.add(nText);
		draw.add(new FontAction("graph.nodes", FontLib.getFont("Tahoma", Font.BOLD, 12)));
		draw.add(nEdges);

		vis.putAction("draw", draw);

		ActionList layout = new ActionList(Activity.DEFAULT_STEP_TIME);

		BalloonTreeLayout balloonlayout = new BalloonTreeLayout("graph", 50);
		layout.add(balloonlayout);

		Display d = new Display(vis);

		vis.putAction("layout", layout);

		d.addControlListener(new DragControl());
		// pan with left-click drag on background
		d.addControlListener(new PanControl());
		// zoom with right-click drag
		d.addControlListener(new ZoomControl());

		// -- 6. launch the visualization -------------------------------------

		// create a new window to hold the visualization
		JFrame frame = new JFrame("prefuse example");
		// ensure application exits when window is closed
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(d);
		frame.pack(); // layout components in window
		frame.setVisible(true); // show the window

		// start up the animated layout
		vis.run("draw");
		vis.run("layout");

	}
}